import { ref, reactive, computed } from 'vue';
import { ElMessage, ElMessageBox } from 'element-plus';
import { 
  getUserList, 
  addUser, 
  updateUser, 
  deleteUser 
} from '../apis/user.js';

// 后端API类型定义
/**
 * 用户列表API返回数据结构
 * @typedef {Object} UserListResponse
 * @property {number} code - 返回码，200表示成功
 * @property {string} message - 返回消息
 * @property {Object} data - 返回数据
 * @property {Array<UserInfo>} data.list - 用户列表
 * @property {number} data.total - 总记录数
 */

/**
 * 用户信息结构
 * @typedef {Object} UserInfo
 * @property {number} id - 用户ID
 * @property {string} username - 用户名
 * @property {string} realName - 真实姓名
 * @property {string} email - 邮箱
 * @property {string} phone - 手机号
 * @property {number} userType - 用户类型：1-普通用户 2-企业用户 3-平台管理员
 * @property {number|null} enterpriseId - 企业ID
 * @property {string} enterpriseName - 企业名称
 * @property {string} avatar - 头像
 * @property {number} status - 状态：0-禁用 1-正常
 */

export default function useUserManagement() {
  // 状态管理
  const loading = ref(false);
  const dialogVisible = ref(false);
  const userFormRef = ref(null);

  // 搜索表单
  const searchForm = reactive({
    username: '',
    userType: '',
    status: ''
  });

  // 分页配置
  const pagination = reactive({
    currentPage: 1,
    pageSize: 10,
    total: 0
  });

  // 用户数据列表
  const userDataList = ref([]);

  // 用户类型选项
  const userTypeOptions = [
    { label: '普通用户', value: 1 },
    { label: '企业用户', value: 2 },
    { label: '平台管理员', value: 3 }
  ];

  // 状态选项
  const statusOptions = [
    { label: '禁用', value: 0 },
    { label: '正常', value: 1 }
  ];

  // 用户表单
  const userForm = reactive({
    id: '',
    username: '',
    password: '',
    realName: '',
    email: '',
    phone: '',
    userType: 1,
    enterpriseId: null,
    status: '1'
  });

  // 表单验证规则
  const formRules = {
    username: [
      { required: true, message: '请输入用户名', trigger: 'blur' },
      { min: 3, max: 50, message: '用户名长度在 3 到 50 个字符', trigger: 'blur' }
    ],
    password: [
      { required: true, message: '请输入密码', trigger: 'blur' },
      { min: 6, max: 20, message: '密码长度在 6 到 20 个字符', trigger: 'blur' }
    ],
    realName: [
      { max: 50, message: '真实姓名不超过 50 个字符', trigger: 'blur' }
    ],
    email: [
      { type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }
    ],
    phone: [
      { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: ['blur', 'change'] }
    ],
    userType: [
      { required: true, message: '请选择用户类型', trigger: 'change' }
    ],
    enterpriseId: [
      { required: true, message: '请输入企业ID', trigger: 'blur' },
      { type: 'number', message: '企业ID必须是数字', trigger: 'blur' }
    ]
  };

  // 判断是否为编辑模式
  const isEditMode = computed(() => !!userForm.id);

  // 对话框标题
  const dialogTitle = computed(() => {
    return isEditMode.value ? '编辑用户' : '新增用户';
  });

  // 获取用户列表数据
  const fetchUserData = async () => {
    loading.value = true;
    try {
      const params = {
        page: pagination.currentPage,
        pageSize: pagination.pageSize,
        // 将空字符串转换为null，避免不必要的参数传递
        username: searchForm.username || undefined,
        userType: searchForm.userType !== '' ? Number(searchForm.userType) : undefined,
        status: searchForm.status !== '' ? Number(searchForm.status) : undefined
      };
      
      const response = await getUserList(params);
      
      if (response.code === 200) {
        // 解析后端返回的数据，适配前端需要的格式
        // 假设后端返回的结构是 { code, message, data: { records, total, size, current } }
        userDataList.value = response.data.records || [];
        pagination.total = response.data.total || 0;
      } else {
        ElMessage.error(response.message || '获取用户列表失败');
      }
    } catch (error) {
      console.error('获取用户列表失败:', error);
      ElMessage.error('获取用户列表失败');
    } finally {
      loading.value = false;
    }
  };

  // 重置表单
  const resetForm = () => {
    if (userFormRef.value) {
      userFormRef.value.resetFields();
    }
    Object.assign(userForm, {
      id: '',
      username: '',
      password: '',
      realName: '',
      email: '',
      phone: '',
      userType: 1,
      enterpriseId: null,
      status: '1'
    });
  };

  // 打开新增用户对话框
  const handleAddUser = () => {
    resetForm();
    dialogVisible.value = true;
  };

  // 打开编辑用户对话框
  const handleEditUser = (user) => {
    resetForm();
    Object.assign(userForm, {
      ...user,
      status: String(user.status) // 转换为字符串以便switch组件使用
    });
    dialogVisible.value = true;
  };

  // 提交表单
  const handleFormSubmit = async () => {
    if (!userFormRef.value) return;
    
    try {
      await userFormRef.value.validate();
      
      loading.value = true;
      
      // 准备提交数据
      const submitData = { ...userForm };
      
      // 处理状态字段转换
      submitData.status = Number(submitData.status);
      
      // 如果密码为空且是编辑模式，则删除密码字段
      if (isEditMode.value && !submitData.password) {
        delete submitData.password;
      }
      
      if (isEditMode.value) {
        // 编辑用户
        const response = await updateUser(userForm.id, submitData);
        if (response.code === 200) {
          ElMessage.success('编辑用户成功');
          dialogVisible.value = false;
          fetchUserData(); // 重新获取数据
        } else {
          ElMessage.error(response.message || '编辑用户失败');
        }
      } else {
        // 新增用户
        const response = await addUser(submitData);
        if (response.code === 200) {
          ElMessage.success('新增用户成功');
          dialogVisible.value = false;
          fetchUserData(); // 重新获取数据
        } else {
          ElMessage.error(response.message || '新增用户失败');
        }
      }
    } catch (error) {
      console.error('提交表单失败:', error);
      if (error === false) {
        // 验证失败，不显示错误信息
      } else {
        ElMessage.error('操作失败');
      }
    } finally {
      loading.value = false;
    }
  };

  // 删除用户
  const handleDeleteUser = (user) => {
    ElMessageBox.confirm(
      `确定要删除用户「${user.username}」吗？`,
      '删除确认',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }
    )
      .then(async () => {
        loading.value = true;
        try {
          const response = await deleteUser(user.id);
          if (response.code === 200) {
            ElMessage.success('删除用户成功');
            fetchUserData(); // 重新获取数据
          } else {
            ElMessage.error(response.message || '删除用户失败');
          }
        } catch (error) {
          console.error('删除用户失败:', error);
          ElMessage.error('删除用户失败');
        } finally {
          loading.value = false;
        }
      })
      .catch(() => {
        // 用户取消删除
      });
  };

  // 关闭对话框
  const handleDialogClose = () => {
    if (userFormRef.value) {
      userFormRef.value.resetFields();
    }
  };

  // 搜索
  const handleSearch = () => {
    pagination.currentPage = 1;
    fetchUserData();
  };

  // 重置搜索
  const resetSearch = () => {
    Object.assign(searchForm, {
      username: '',
      userType: '',
      status: ''
    });
    pagination.currentPage = 1;
    fetchUserData();
  };

  // 分页大小变化
  const handleSizeChange = (size) => {
    pagination.pageSize = size;
    fetchUserData();
  };

  // 当前页码变化
  const handleCurrentChange = (current) => {
    pagination.currentPage = current;
    fetchUserData();
  };

  // 获取用户类型标签类型
  const getUserTypeTagType = (userType) => {
    const typeMap = {
      1: 'primary',
      2: 'success',
      3: 'danger'
    };
    return typeMap[userType] || 'info';
  };

  // 获取用户类型标签
  const getUserTypeLabel = (userType) => {
    const labelMap = {
      1: '普通用户',
      2: '企业用户',
      3: '平台管理员'
    };
    return labelMap[userType] || '未知';
  };

  // 获取用户状态标签类型
  const getUserStatusTagType = (status) => {
    return status === 1 ? 'success' : 'danger';
  };

  // 获取用户状态标签
  const getUserStatusLabel = (status) => {
    return status === 1 ? '正常' : '禁用';
  };

  return {
    // 状态
    loading,
    dialogVisible,
    userFormRef,
    // 数据
    searchForm,
    pagination,
    userDataList,
    userTypeOptions,
    statusOptions,
    userForm,
    formRules,
    // 计算属性
    isEditMode,
    dialogTitle,
    // 方法
    fetchUserData,
    resetForm,
    handleAddUser,
    handleEditUser,
    handleFormSubmit,
    handleDeleteUser,
    handleDialogClose,
    handleSearch,
    resetSearch,
    handleSizeChange,
    handleCurrentChange,
    getUserTypeTagType,
    getUserTypeLabel,
    getUserStatusTagType,
    getUserStatusLabel
  };
}